package com.common.util;

import java.util.Date;

import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;

import cn.hutool.core.date.DateUtil;


/**
 * @author ficus 日期格式处理工具
 */
public final class DateFormatUtil extends DateFormatUtils {

	public static final String PATTERN_ISO_ON_SECOND = "yyyy-MM-dd'T'HH:mm:ss";
	public static final String PATTERN_ISO_ON_SECOND_SSS = "yyyy-MM-dd'T'HH:mm:ss.SSS";
	public static final String PATTERN_ISO_ON_SECOND_SSS_Z = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
	public static final String PATTERN_ISO_ON_SECOND_SSS_ZZ = "yyyy-MM-dd'T'HH:mm:ss.SSS'ZZ'";
	
	public static final String PATTERN_DEFAULT_ON_DATE = "yyyy-MM-dd";
	public static final String PATTERN_DEFAULT_ON_SECOND = "yyyy-MM-dd HH:mm:ss";
	public static final String PATTERN_DEFAULT_ON_SECOND_SSS = "yyyy-MM-dd HH:mm:ss.SSS";
	
	/**
	 * 转换默认的时间格式 yyyy-MM-dd HH:mm:ss
	 * @param date
	 * @return
	 */
	public static String format(final Date date) {
		return format(date, PATTERN_DEFAULT_ON_SECOND);
	}
	
    /**
     * 转换默认的时间格式 yyyy-MM-dd HH:mm:ss
     * @param millis 
     * @return 
     */
    public static String format(final long millis) {
        return format(new Date(millis));
    }
	
    /**
     * 打印用户友好的，与当前时间相比的时间差，如刚刚，5分钟前，今天XXX，昨天XXX
     */
    public static String formatFriendlyTimeSpanByNow(Date date) {
        return formatFriendlyTimeSpanByNow(date.getTime());
    }
    
    /**
     * 打印用户友好的，与当前时间相比的时间差，如刚刚，5分钟前，今天XXX，昨天XXX
     */
    public static String formatFriendlyTimeSpanByNow(long timeStampMillis) {
        long now = System.currentTimeMillis();
        long span = now - timeStampMillis;
        if (span < 0) {
            // 未来日期
            return String.format("%tc", timeStampMillis);
        }
        if (span < DateUtils.MILLIS_PER_SECOND) {
            return "刚刚";
        } else if (span < DateUtils.MILLIS_PER_MINUTE) {
            return String.format("%d秒前", span / DateUtils.MILLIS_PER_SECOND);
        } else if (span < DateUtils.MILLIS_PER_HOUR) {
            return String.format("%d分钟前", span / DateUtils.MILLIS_PER_MINUTE);
        }
        // 获取当天00:00
        long wee = DateUtil.beginOfDay(new Date(now)).getTime();
        if (timeStampMillis >= wee) {
            return String.format("今天%tR", timeStampMillis);
        } else if (timeStampMillis >= wee - DateUtils.MILLIS_PER_DAY) {
            return String.format("昨天%tR", timeStampMillis);
        } else {
            return String.format("%tF", timeStampMillis);
        }
    }
    
	public static void main(String[] args) {
		System.err.println(format(new Date(), PATTERN_DEFAULT_ON_SECOND));
		System.err.println(DateUtil.beginOfDay(new Date()));
	}
}
